/*********************************************************************
*                SEGGER Microcontroller GmbH & Co. KG                *
*        Solutions for real time microcontroller applications        *
**********************************************************************
*                                                                    *
*        (c) 1996 - 2010  SEGGER Microcontroller GmbH & Co. KG       *
*                                                                    *
*        Internet: www.segger.com    Support:  support@segger.com    *
*                                                                    *
**********************************************************************

** emWin V5.06 - Graphical user interface for embedded applications **
emWin is protected by international copyright laws.   Knowledge of the
source code may not be used to write a similar product.  This file may
only be used in accordance with a license and should not be re-
distributed in any way. We appreciate your understanding and fairness.
----------------------------------------------------------------------
File        : GUI__memset.c
Purpose     : Implementation of said function
---------------------------END-OF-HEADER------------------------------
*/

#include "GUI_Private.h"

/*********************************************************************
*
*       public code
*
**********************************************************************
*/
/*********************************************************************
*
*       GUI__memset
*
* Purpose:
*  Replacement for the memset function. The advantage is high speed
*  on all systems (sometime up to 10 times as fast as the one
*  in the library)
*  Main idea is to write int-wise.
*/
void GUI__memset(U8* p, U8 Fill, int NumBytes) {
  int NumInts;
  /* Write bytes until we are done or have reached an int boundary */
  while (NumBytes && ((sizeof(int) - 1) & (U32)p)) {
    *p++ = Fill;
    NumBytes--;
  }
  /* Write Ints */
  NumInts = (unsigned)NumBytes / sizeof(int);
  if (NumInts) {
    int FillInt;
    int *pInt;
    NumBytes &= (sizeof(int) - 1);
    if (sizeof(int) == 2) {        /* May some compilers generate a warning at this line: Condition is alwaws true/false */
      FillInt = Fill * 0x101;      /* May some compilers generate a warning at this line: Unreachable code */
    } else if (sizeof(int) == 4) { /* May some compilers generate a warning at this line: Condition is alwaws true/false */
      FillInt = Fill * 0x1010101;  /* May some compilers generate a warning at this line: Unreachable code */
    }
    pInt = (int*)p;
    /* Fill large amount of data at a time */
    while (NumInts >= 4) { 
      *pInt++ = FillInt;
      *pInt++ = FillInt;
      *pInt++ = FillInt;
      *pInt++ = FillInt;
      NumInts -= 4;
    }
    /* Fill one int at a time */
    while (NumInts) {
      *pInt++ = FillInt;
      NumInts--;
    }
    p = (U8*)pInt;
  }
  /* Fill the remainder byte wise */
  while (NumBytes) {
    *p++ = Fill;
    NumBytes--;
  }
}

/*************************** End of file ****************************/
